import { createSlice } from '@reduxjs/toolkit';
import { getFindByParentId } from "@/api/dict";
import { useSelector } from "react-redux";


// 定义一个查找info的函数 
const findInfo: any = (arr: any, id: number) => { 
  let info
  for (let i = 0; i < arr.length; i++) {
    if (arr[i].id === id) {
      info = arr[i]
    } else if (arr[i].children && arr[i].children.length > 0) {
      info = findInfo(arr[i].children, id)
    }
    if (info) break
  }
  return info
}


const dictSlice = createSlice({
  name: 'dict',
  initialState: {
    dictList: [],
    loading: false // 加载状态
  },

  /*
  思路：
  1- 根据省份ID,可以获得省份下的类别
  2- 获取到省份下的类别后，需要将数据作为省份对象下的children属性值
  */

  reducers: {
    upDictList(state, { payload }) {
      // payload.parentId 作为条件，找省份
      // console.log(payload); // 对象: parentId 和dictList 两个属性 
      const info: any = findInfo(state.dictList, payload.parentId)
      if (info) { // 如果有子元素 那么让子元素的列表
        info.children = payload.dictList
      } else {
        state.dictList = payload.dictList
      }
    },
    // 修改loading的方法
    upLoading(state, { payload }) {
      state.loading = payload
    }
  }
})

const { upDictList, upLoading } = dictSlice.actions

// 
export const getFindByParentIdAsync = (parentId: number) => {
  return async (dispatch: any) => {
    dispatch(upLoading(true)); // 加载状态 改成true
    const result = await getFindByParentId(parentId);
    // console.log( parentId);
    // console.log(result.data);  获取到的所有数据

    dispatch(upDictList({
      dictList: result.data.map((item: any) => {
        // 如果数据有 hasChildren 属性 那么加上children属性 值是[]  那么该元素才能展开
        if (item.hasChildren) {
          item.children = []
        }
        return item
      }),
      parentId
      
    }));
    dispatch(upLoading(false)) // 加载状态 改成false
  }
}
export const useSelectorDict = () => useSelector((state: any) => state.dict);
export default dictSlice.reducer;


